Mô tả thuật toán Thuật_toán_Berlekamp–Massey

Thuật toán Berlekamp–Massey là một phương pháp giải hệ các phương trình tuyến tính mô tả trong thuật toán giải mã Peterson cho mã Reed–Solomon, có thể tóm tắt như sau:

S i + ν + Λ 1 S i + ν − 1 + ⋯ + Λ ν − 1 S i + 1 + Λ ν S i = 0. {\displaystyle S_{i+\nu }+\Lambda _{1}S_{i+\nu -1}+\cdots +\Lambda _{\nu -1}S_{i+1}+\Lambda _{\nu }S_{i}=0.}

Dưới đây, C(x) là một trường hợp nhất định của Λ(x). Đa thức định vị lỗi C(x) cho L lỗi được định nghĩa là:

C ( x ) = C L   x L + C L − 1   x L − 1 + ⋯ + C 2   x 2 + C 1   x + 1 {\displaystyle C(x)=C_{L}\ x^{L}+C_{L-1}\ x^{L-1}+\cdots +C_{2}\ x^{2}+C_{1}\ x+1}

hay viết ngược lại:

C ( x ) = 1 + C 1   x + C 2   x 2 + ⋯ + C L − 1   x L − 1 + C L   x L . {\displaystyle C(x)=1+C_{1}\ x+C_{2}\ x^{2}+\cdots +C_{L-1}\ x^{L-1}+C_{L}\ x^{L}.}

Mục tiêu của thuật toán là tìm bậc L nhỏ nhất và đa thức C(x) sao cho:

S n + C 1   S n − 1 + ⋯ + C L   S n − L = 0 {\displaystyle S_{n}+C_{1}\ S_{n-1}+\cdots +C_{L}\ S_{n-L}=0}

với mọi giá trị hội chứng S đã cho, n = L to (N-1).

Thuật toán hoạt động như sau. Khởi tạo C(x) bằng 1, L là giả định số lượng lỗi hiện tại, khởi tạo bằng 0. N là số giá trị hội chứng. n là biến lặp chính và là chỉ số của giá trị hội chứng từ 0 đến (N-1). B(x) lưu giá trị cũ cuối cùng của C(x) mỗi lần L thay đổi, và được khởi tạo bằng 1. b lưu giá trị cũ cuối cùng của độ sai lệch d (giải thích ở dưới) mỗi lần L thay đổi, và được khởi tạo bằng 1. m là số lần lặp từ lần cuối L, B(x), và b thay đổi và được khởi tạo bằng 1.

Trong mỗi lần lặp, thuật toán tính một giá trị sai lệch d. Ở lần lặp thứ k giá trị đó là:

d = S k + C 1   S k − 1 + ⋯ + C L   S k − L . {\displaystyle d=S_{k}+C_{1}\ S_{k-1}+\cdots +C_{L}\ S_{k-L}.}

Nếu d bằng 0, thuật toán giả sử rằng C(x) và L hiện tại vẫn đúng, tăng m, và tiếp tục.

Nếu d khác 0, thuật toán thay đổi C(x) sao cho khi tính lại thì d bằng 0:

C ( x ) = C ( x )   −   ( d / b )   x m   B ( x ) . {\displaystyle C(x)=C(x)\ -\ (d/b)\ x^{m}\ B(x).}

Thừa số xm dịch B(x) đi m vị trí nên nó nhận giá trị ứng với b. Nếu lần cuối cùng L thay đổi là ở lần lặp thứ j, thì m = k - j, và giá trị sai lệch tính lại sẽ là:

d = S k + C 1   S k − 1 + ⋯ − ( d / b ) ( S j + B 1   S j − 1 + ⋯ ) . {\displaystyle d=S_{k}+C_{1}\ S_{k-1}+\cdots -(d/b)(S_{j}+B_{1}\ S_{j-1}+\cdots ).}

Vì vậy, giá trị sai lệch mới là:

d = d − ( d / b ) b = d − d = 0.   {\displaystyle d=d-(d/b)b=d-d=0.\ }

Thuật toán cũng tăng giá trị L (số lỗi) nếu cần. Nếu L đúng bằng số lỗi thì trong quá trình lặp, tất cả các giá trị sai lệch sẽ trở thành 0 trước khi n lớn hơn hoặc bằng (2 L). Nếu giả thiết này không đúng, thuật toán tăng L và cập nhật giá trị B(x), b, tăng L, và khởi tạo lại m = 1. Công thức L = (n + 1 - L) giới hạn giá trị L nhỏ hơn hoặc bằng số giá trị hội chứng đã cho, và cũng giải quyết trường hợp tăng L nhiều hơn 1.